import mongoose, { Document, Model } from 'mongoose';

/**
 * 基础数据访问对象
 * 提供通用的数据库操作方法
 */
export abstract class BaseDAO<T extends Document> {
  protected model: Model<T>;

  constructor(model: Model<T>) {
    this.model = model;
  }

  /**
   * 根据ID查找文档
   * @param id 文档ID
   * @returns 文档或null
   */
  async findById(id: mongoose.Types.ObjectId | string): Promise<T | null> {
    if (!mongoose.Types.ObjectId.isValid(id)) {
      throw new Error('无效的ID');
    }
    return await this.model.findById(id).exec();
  }

  /**
   * 查找所有文档
   * @param filter 过滤条件
   * @returns 文档数组
   */
  async findAll(filter: any = {}): Promise<T[]> {
    return await this.model.find(filter).exec();
  }

  /**
   * 根据条件查找单个文档
   * @param filter 过滤条件
   * @returns 文档或null
   */
  async findOne(filter: any): Promise<T | null> {
    return await this.model.findOne(filter).exec();
  }

  /**
   * 统计文档数量
   * @param filter 过滤条件
   * @returns 文档数量
   */
  async count(filter: any = {}): Promise<number> {
    return await this.model.countDocuments(filter).exec();
  }

  /**
   * 检查文档是否存在
   * @param id 文档ID
   * @returns 是否存在
   */
  async exists(id: mongoose.Types.ObjectId | string): Promise<boolean> {
    if (!mongoose.Types.ObjectId.isValid(id)) {
      return false;
    }
    const doc = await this.model.findById(id).select('_id').exec();
    return !!doc;
  }
}